package com.mmy.controller;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.mmy.service.car.impl.TCarBaseServiceImpl;
import com.mmy.service.car.impl.TCarOrderServiceImpl;
import com.mmy.service.car.impl.TCarPlanServiceImpl;
import com.mmy.service.impl.bidtender.BidInviteServiceImpl;
import com.mmy.service.impl.hotel.THotelBaseServiceImpl;
import com.mmy.service.impl.hotel.THotelOrderServiceImpl;
import com.mmy.service.impl.hotel.THotelPlanServiceImpl;
import com.mmy.service.impl.hotel.THotelRoomServiceImpl;
import com.mmy.service.impl.line.LineBaseServiceImpl;
import com.mmy.service.impl.line.LineOrderServiceImpl;
import com.mmy.service.impl.line.LinePlaceServiceImpl;
import com.mmy.service.impl.line.LinePlanServiceImpl;
import com.mmy.service.impl.line.LineTripServiceImpl;
import com.mmy.service.impl.restaurant.TRestaurantBaseServiceImpl;
import com.mmy.service.impl.restaurant.TRestaurantOrderServiceImpl;
import com.mmy.service.impl.restaurant.TRestaurantPlanServiceImpl;
import com.mmy.service.impl.visa.TVisaOrderServiceImpl;
import com.mmy.service.impl.visa.VisaBaseServiceImpl;
import com.mmy.service.permissionmenu.impl.UserPermissionServiceImpl;
import com.mmy.service.plane.impl.TPlaneBaseServiceImpl;
import com.mmy.service.plane.impl.TPlaneOrderServiceImpl;
import com.mmy.service.plane.impl.TPlanePlanServiceImpl;
import com.mmy.service.scenic.impl.ScenicPlanServiceImpl;
import com.mmy.service.scenic.impl.TScenicBaseServiceImpl;
import com.mmy.service.scenic.impl.TScenicOrderServiceImpl;
import com.mmy.service.ship.impl.TShipBaseServiceImpl;
import com.mmy.service.ship.impl.TShipOrderServiceImpl;
import com.mmy.service.ship.impl.TShipPlanServiceImpl;
import com.mmy.service.train.impl.TrainBaseServiceImpl;
import com.mmy.service.train.impl.TrainOrderServiceImpl;
import com.mmy.service.train.impl.TrainPlanServiceImpl;

@Controller
public class Common {

	@Autowired
	LinePlanServiceImpl implLinePlan;
	@Autowired
	TCarPlanServiceImpl implCarPlan;
	@Autowired
	THotelPlanServiceImpl implHotelPlan;
	@Autowired
	TPlanePlanServiceImpl implPlanePlan;
	@Autowired
	TRestaurantPlanServiceImpl implRestaurantPlan;
	@Autowired
	ScenicPlanServiceImpl implScenicPlan;
	@Autowired
	TShipPlanServiceImpl implShipPlan;
	@Autowired
	TrainPlanServiceImpl implTrainPlan;
	@Autowired
	LineOrderServiceImpl implLineOrder;
	@Autowired
	TCarOrderServiceImpl implCarOrder;
	@Autowired
	THotelOrderServiceImpl implHotelOrder;
	@Autowired
	TPlaneOrderServiceImpl implPlaneOrder;
	@Autowired
	TRestaurantOrderServiceImpl implRestaurantOrder;
	@Autowired
	TScenicOrderServiceImpl implScenicOrder;
	@Autowired
	TShipOrderServiceImpl implShipOrder;
	@Autowired
	TrainOrderServiceImpl implTrainOrder;
	@Autowired
	TVisaOrderServiceImpl implVisaOrder;
	@Autowired
	UserPermissionServiceImpl implUserPermission;
	@Autowired
	VisaBaseServiceImpl implVisaBase;
	@Autowired
	TrainBaseServiceImpl implTrainBase;
	@Autowired
	TShipBaseServiceImpl implShipBase;
	@Autowired
	TScenicBaseServiceImpl implScenicBase;
	@Autowired
	TRestaurantBaseServiceImpl implRestaurantBase;
	@Autowired
	TPlaneBaseServiceImpl implPlaneBase;
	@Autowired
	THotelBaseServiceImpl implHotelBase;
	@Autowired
	THotelRoomServiceImpl implHotelRoom;
	@Autowired
	TCarBaseServiceImpl implCarBase;
	/** 招标信息 hanxl 2020.11.19 */
	@Autowired
	BidInviteServiceImpl implBidInvite;
	@Autowired
	LineBaseServiceImpl implLineBase;
	@Autowired
	LineTripServiceImpl implLineTrip;
	@Autowired
	LinePlaceServiceImpl implLinePlace;

	public HashMap<String, Integer> getPage(String pageNumber, String pageSize, int iCount) {

		int iPageSize = 0;
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
		}

		// 页数
		int iPageNo = 0;
		if (pageNumber == null) {
			iPageNo = 1;
		} else {
			iPageNo = Integer.valueOf(pageNumber);

			if (iPageNo < 1) {
				iPageNo = 1;
			}
		}
		// 设置最大页数
		int iTotalCount = 0;

		if (iCount > 0) {
			iTotalCount = iCount;
		}

		int iMaxPage = iTotalCount % iPageSize == 0 ? iTotalCount / iPageSize : iTotalCount / iPageSize + 1;

		if (iPageNo > iMaxPage && iMaxPage != 0) {
			iPageNo = iMaxPage;
		} else if (iPageNo > iMaxPage && iMaxPage == 0) {
			iMaxPage = iPageNo;
		}
		// 分页查询条件
		int iTempPageNo = (iPageNo - 1) * iPageSize;
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();

		mapPage.put("iTempPageNo", iTempPageNo);
		mapPage.put("iPageSize", iPageSize);
		mapPage.put("iTotalCount", iTotalCount);
		mapPage.put("iMaxPage", iMaxPage);
		mapPage.put("iPageNo", iPageNo);

		return mapPage;
	}

	/**
	 * 生成基础编码 2位年码+6位数据码
	 * 
	 * @param 参数说明 表名常量
	 * @return 返回值说明 基础编码
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.17
	 */
	public int createBaseCode(String strTableName) {
		// 获得2位年码
		String strYear = getDate(UtilConstants.DateStyle.YYYY).substring(2);
		// 获得6位数据码
		// 获得最大编号
		int iCode = getMaxID(strTableName);
		// 最大编码顺番+1
		String strCode = String.valueOf(iCode);
		// 判断是否存在最大值，如果存在加1，如果不存在从1开始
		if (iCode == 0) {
			strCode = String.format("%06d", 1);
		} else {
			strCode = String.format("%06d", Integer.parseInt(strCode.substring(2)) + 1);
		}
		String strBaseCode = strYear + strCode;
		return Integer.parseInt(strBaseCode);
	}

	/**
	 * 生成计划单编码 2位年码+6位数据码
	 * 
	 * @param 参数说明 表名常量
	 * @return 返回值说明 计划单编码
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.12
	 */
	public int createPlanCode(String strTableName) {
		// 获得2位年码
		String strYear = getDate(UtilConstants.DateStyle.YYYY).substring(2);

		// 获得6位数据码
		// 获得最大编号
		String strCode = getMaxCode(strTableName);
		// 判断是否存在最大值，如果存在加1，如果不存在从1开始
		if (strCode == "") {
			strCode = String.format("%06d", 1);
		} else {
			strCode = String.format("%06d", Integer.parseInt(strCode.substring(2)) + 1);
		}
		// 计划单编码
		String strPlanCode = strYear + strCode;
		return Integer.parseInt(strPlanCode);
	}

	/**
	 * 根据索引获得视图名
	 * 
	 * @param 参数说明 指定视图名常量
	 * @return 返回值说明 表名
	 * @author 创建人 liys
	 * @date 创建日期 2020.11.14
	 */
	public String getViewName(String sort) {

		String strTable = "";
		switch (sort) {

		case "A":
			strTable = UtilConstants.ViewNum.A;
			break;

		case "B":
			strTable = UtilConstants.ViewNum.B;
			break;

		case "C":
			strTable = UtilConstants.ViewNum.C;
			break;

		case "D":
			strTable = UtilConstants.ViewNum.D;
			break;

		case "E":
			strTable = UtilConstants.ViewNum.E;
			break;

		case "F":
			strTable = UtilConstants.ViewNum.F;
			break;

		case "G":
			strTable = UtilConstants.ViewNum.G;
			break;

		case "H":
			strTable = UtilConstants.ViewNum.H;
			break;

		case "I":
			strTable = UtilConstants.ViewNum.I;
			break;

		default:
			strTable = UtilConstants.ViewNum.A;
		}

		return strTable;
	}

	/**
	 * 根据索引获得表名
	 * 
	 * @param 参数说明 指定视图名常量
	 * @return 返回值说明 表名
	 * @author 创建人 liys
	 * @date 创建日期 2020.11.14
	 */
	public String getTableName(String sort) {

		String strTable = "";
		switch (sort) {

		case "A":
			strTable = UtilConstants.TableNum.A;
			break;

		case "B":
			strTable = UtilConstants.TableNum.B;
			break;

		case "C":
			strTable = UtilConstants.TableNum.C;
			break;

		case "D":
			strTable = UtilConstants.TableNum.D;
			break;

		case "E":
			strTable = UtilConstants.TableNum.E;
			break;

		case "F":
			strTable = UtilConstants.TableNum.F;
			break;

		case "G":
			strTable = UtilConstants.TableNum.G;
			break;

		case "H":
			strTable = UtilConstants.TableNum.H;
			break;

		case "I":
			strTable = UtilConstants.TableNum.I;
			break;

		default:
			strTable = UtilConstants.TableNum.A;
		}

		return strTable;
	}

	/**
	 * 获取图表商品顺序
	 * 
	 * @param 参数说明
	 * @return 返回值说明 商品集合
	 * @author 创建人 liys
	 * @date 创建日期 2021.04.16
	 */
	public List<String> getChartList() {

		return UtilConstants.Public.CHART_LIST;
	}

	public List<String> getChartHref() {

		return UtilConstants.Public.CHART_HREF;
	}

	/**
	 * 获得指定表的最大编码
	 * 
	 * @param 参数说明 指定表的名常量
	 * @return 返回值说明 最大编码
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.14
	 */
	public String getMaxCode(String strTableName) {
		// 最大编号
		String strCode = "";
		// 按表名获得最大编码
		switch (strTableName) {
		case UtilConstants.TableName.T_LINE_PLAN:
			// 线路计划表
			strCode = implLinePlan.getMaxPlanID();
			break;
		case UtilConstants.TableName.T_CAR_PLAN:
			// 车辆计划表
			strCode = implCarPlan.getMaxPlanID();
			break;
		case UtilConstants.TableName.T_HOTEL_PLAN:
			// 酒店计划表
			strCode = implHotelPlan.getMaxPlanID();
			break;
		case UtilConstants.TableName.T_PLANE_PLAN:
			// 航班时刻表
			strCode = implPlanePlan.getMaxPlanID();
			break;
		case UtilConstants.TableName.T_RESTAURANT_PLAN:
			// 餐馆计划表
			strCode = implRestaurantPlan.getMaxPlanID();
			break;
		case UtilConstants.TableName.T_SCENIC_PLAN:
			// 电子票计划表
			strCode = implScenicPlan.getMaxPlanID();
			break;
		case UtilConstants.TableName.T_SHIP_PLAN:
			// 游轮航程表
			strCode = implShipPlan.getMaxPlanID();
			break;
		case UtilConstants.TableName.T_TRAIN_PLAN:
			// 列车时刻表
			strCode = implTrainPlan.getMaxPlanID();
			break;
		}
		return strCode;
	}

	/**
	 * 生成订单编码 计划单编码+8位年月日码+6位数据码
	 * 
	 * @param 参数说明 表名常量；计划单编码
	 * @return 返回值说明 订单编码
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.12
	 */
	public String createOrderCode(String strTableName, int iPlanCode) {
		// 获得8位年月日码
		String strDate = getDate(UtilConstants.DateStyle.YYYYMMDD);

		// 获得4位数据码
		// 获得最大编号
		String strCode = getMaxCode(strTableName, iPlanCode);
		// 判断是否存在最大值，如果存在加1，如果不存在从1开始
		if (strCode == "") {
			strCode = String.format("%06d", 1);
		} else {
			strCode = String.format("%06d", Integer.parseInt(strCode.substring(16)) + 1);
		}

		// 订单编码
		String strPlanCode = String.valueOf(iPlanCode) + strDate + strCode;
		return strPlanCode;
	}

	/**
	 * 获得指定表的最大编码
	 * 
	 * @param 参数说明 指定表的名常量，计划单编码
	 * @return 返回值说明 最大编码
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.14
	 */
	public String getMaxCode(String strTableName, int iPlanID) {
		// 最大编号
		String strCode = null;
		// 按表名获得最大编码
		switch (strTableName) {
		case UtilConstants.TableName.T_LINE_ORDER:
			// 线路订单表
			strCode = implLineOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_CAR_ORDER:
			// 车辆订单表
			strCode = implCarOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_HOTEL_ORDER:
			// 酒店订单表
			strCode = implHotelOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_PLANE_ORDER:
			// 机票订单表
			strCode = implPlaneOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_RESTAURANT_ORDER:
			// 餐馆订单表
			strCode = implRestaurantOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_SCENIC_ORDER:
			// 电子票订单表
			strCode = implScenicOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_SHIP_ORDER:
			// 船票订单表
			strCode = implShipOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_TRAIN_ORDER:
			// 专列订单表
			strCode = implTrainOrder.getMaxCode(iPlanID);
			break;
		case UtilConstants.TableName.T_VISA_ORDER:
			// 签证订单表
			strCode = implVisaOrder.getMaxCode(iPlanID);
			break;
		}
		return strCode;
	}

	/**
	 * 生成ID
	 * 
	 * @param 参数说明 表名常量
	 * @return 返回值说明 最大ID+1
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.16
	 */
	public int createMaxID(String strTableName) {
		// 获得最大ID
		int iID = getMaxID(strTableName);
		// 流水号+1
		iID = iID + 1;
		return iID;
	}

	/**
	 * 获得指定表的最大ID
	 * 
	 * @param 参数说明 指定表的名常量
	 * @return 返回值说明 最大ID
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.16
	 */
	public int getMaxID(String strTableName) {
		// 最大ID
		int iID = 0;
		// 按表名获得最大编码
		switch (strTableName) {
		case UtilConstants.TableName.T_LINE_ORDER:
			// 线路订单表
			iID = implLineOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_CAR_ORDER:
			// 车辆订单表
			iID = implCarOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_HOTEL_ORDER:
			// 酒店订单表
			iID = implHotelOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_PLANE_ORDER:
			// 机票订单表
			iID = implPlaneOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_RESTAURANT_ORDER:
			// 餐馆订单表
			iID = implRestaurantOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_SCENIC_ORDER:
			// 电子票订单表
			iID = implScenicOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_SHIP_ORDER:
			// 船票订单表
			iID = implShipOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_TRAIN_ORDER:
			// 专列订单表
			iID = implTrainOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_VISA_ORDER:
			// 签证订单表
			iID = implVisaOrder.getMaxID();
			break;
		case UtilConstants.TableName.T_SYS_USER_ROLE:
			// 用户权限对照表
			iID = implUserPermission.getMaxID();
			break;
		case UtilConstants.TableName.T_VISA_BASE:
			// 签证信息表
			iID = implVisaBase.getMaxVisaID();
			break;
		case UtilConstants.TableName.T_TRAIN_BASE:
			// 列车信息表
			iID = implTrainBase.getMaxTrainID();
			break;
		case UtilConstants.TableName.T_SHIP_BASE:
			// 游轮信息表
			iID = implShipBase.getMaxShipID();
			break;
		case UtilConstants.TableName.T_SCENIC_BASE:
			// 景点信息表
			iID = implScenicBase.getMaxScenicID();
			break;
		case UtilConstants.TableName.T_RESTAURANT_BASE:
			// 餐馆信息表
			iID = implRestaurantBase.getMaxRestaurantID();
			break;
		case UtilConstants.TableName.T_PLANE_BASE:
			// 航班信息表
			iID = implPlaneBase.getMaxPlaneID();
			break;
		case UtilConstants.TableName.T_HOTEL_BASE:
			// 酒店信息表
			iID = implHotelBase.getMaxHotelID();
			break;
		case UtilConstants.TableName.T_HOTEL_ROOM:
			// 酒店房间表
			iID = implHotelRoom.getMaxRoomID();
			break;
		case UtilConstants.TableName.T_CAR_BASE:
			// 车辆房间表
			iID = implCarBase.getMaxCarID();
			break;
		case UtilConstants.TableName.T_BID_INVITE:
			// 招标信息表 hanxl 2020.11.19
			iID = implBidInvite.getMaxInviteID();
			break;
		case UtilConstants.TableName.T_LINE_BASE:
			iID = implLineBase.getMaxLineID();
			break;
		case UtilConstants.TableName.T_LINE_TRIP:
			iID = implLineTrip.getMaxTripID();
			break;
		case UtilConstants.TableName.T_LINE_PLACE:
			iID = implLinePlace.getMaxPlaceID();
			break;
		}

		return iID;

	}

	/**
	 * 获得当前日期
	 * 
	 * @param 参数说明 指定日期样式
	 * @return 返回值说明 日期字符串
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.14
	 */
	public String getDate(String strDateStyle) {
		// 获得当前日期
		SimpleDateFormat sdf = new SimpleDateFormat(strDateStyle);
		return sdf.format(new Date());
	}

	/**
	 * 获得表里日期
	 * 
	 * @param 参数说明 指定日期样式
	 * @return 返回值说明 日期字符串
	 * @author 创建人hanxl
	 * @date 创建日期 2020.12.28
	 */
	public String getTableDate(Date dTableDate, String strDateStyle) {
		// 获得当前日期
		SimpleDateFormat sdf = new SimpleDateFormat(strDateStyle);
		return sdf.format(dTableDate);
	}

	/**
	 * 格式化日期
	 * 
	 * @param 参数说明 待处理日期
	 * @return 返回值说明 日期
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.14
	 */
	public Date formatDate(String strDate, String strDateStyle) {
		try {
			// 格式化日期
			SimpleDateFormat sdf = new SimpleDateFormat(strDateStyle);
			return sdf.parse(new String(strDate.replace("T", " ")));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获得两个长日期相差时长（单位小时）
	 * 
	 * @param 参数说明 开始日期，结束日期
	 * @return 返回值说明 相差小时
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.164
	 */
	public BigDecimal getHourBetweenTwoDay(String strBeginDateTime, String strEndDateTime) {

		Date dBeginDate = formatDate(strBeginDateTime, UtilConstants.DateStyle.YYYY_MM_DD_HH_MM);
		Date dEndDate = formatDate(strEndDateTime, UtilConstants.DateStyle.YYYY_MM_DD_HH_MM);

		// 获取时长
		long fHour = dEndDate.getTime() - dBeginDate.getTime();
		// 天
		byte iDay = (byte) (fHour / (1000 * 60 * 60 * 24));
		// 时分
		long fHourMouth = (fHour - iDay * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60) + iDay * 24;

		if (fHourMouth < 0) {
			fHourMouth = fHourMouth * -1;
		}

		return new BigDecimal(fHourMouth);
	}

	/**
	 * 获取当前是星期几
	 * 
	 * @param 参数说明 日期
	 * @return 返回值说明 星期几
	 * @author 创建人 shangzl
	 * @date 创建日期 2020.11.26
	 */
	public String getWeek(Date date) {
		String[] weeks = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (week_index < 0) {
			week_index = 0;
		}
		return weeks[week_index];
	}
}
